/**
 * 标签页相关操作模块
 * 提供与主进程通信的接口，用于控制和管理浏览器标签页
 * @作者 黄敏
 * @创建时间 2025-09-24 23:24
 **/
import { tabTopic, toolbarTopic } from '~shared/ipc-topic'

const ipcRenderer = require('electron').ipcRenderer

export const tab = {
  /**
   * 获取当前标签页数据
   * @param webContentsId - 可选的 webContents ID，默认为当前页面
   * @returns 返回标签页实体对象
   */
  getData: (webContentsId?: number) =>
    ipcRenderer.sendSync(tabTopic.get, webContentsId) as F2.tab.Entity,

  /**
   * 监听标签页更新事件
   * @param callback - 当标签页数据更新时调用的回调函数
   */
  onUpdate: (callback: (data: Partial<F2.tab.Entity>) => void) => {
    ipcRenderer.on(tabTopic.onUpdate, (event: unknown, data: Partial<F2.tab.Entity>) => {
      callback(data)
    })
  },

  /**
   * 监听页面查找结果事件
   * @param callback - 查找完成后的回调函数，接收查找结果和 webContents ID
   * @returns 返回一个取消监听的函数
   */
  onFindInPage: (callback: (result: Electron.Result, webContentsId: number) => void) => {
    const cb = (event: unknown, result: Electron.Result, webContentsId: number) => {
      callback(result, webContentsId)
    }
    ipcRenderer.on(tabTopic.onFindInPage, cb)
    return () => ipcRenderer.off(tabTopic.onFindInPage, cb)
  },

  /**
   * 聚焦到指定标签页
   * @param webContentsId - 可选的 webContents ID，默认为当前页面
   */
  focus: (webContentsId?: number) => ipcRenderer.send(tabTopic.handle.focus, webContentsId),

  /**
   * 后退操作
   * @param webContentsId - 可选的 webContents ID，默认为当前页面
   */
  back: (webContentsId?: number) => ipcRenderer.send(tabTopic.handle.back, webContentsId),

  /**
   * 前进操作
   * @param webContentsId - 可选的 webContents ID，默认为当前页面
   */
  forward: (webContentsId?: number) => ipcRenderer.send(tabTopic.handle.forward, webContentsId),

  /**
   * 刷新当前页面
   * @param webContentsId - 可选的 webContents ID，默认为当前页面
   */
  refresh: (webContentsId?: number) => ipcRenderer.send(tabTopic.handle.refresh, webContentsId),

  /**
   * 导航到指定 URL
   * @param url - 要导航到的网址
   * @param webContentsId - 可选的 webContents ID，默认为当前页面
   */
  navigate: (url?: string, webContentsId?: number) =>
    ipcRenderer.send(tabTopic.handle.navigate, url, webContentsId),

  /**
   * 停止加载页面
   * @param webContentsId - 可选的 webContents ID，默认为当前页面
   */
  stop: (webContentsId?: number) => ipcRenderer.send(tabTopic.handle.stop, webContentsId),

  /**
   * 切换标签页静音状态
   * @param webContentsId - 可选的 webContents ID，默认为当前页面
   */
  toggleMute: (webContentsId?: number) =>
    ipcRenderer.send(tabTopic.handle.toggleMute, webContentsId),

  /**
   * 切换历史记录启用状态
   * @param enabled - 是否启用历史记录
   * @param webContentsId - 可选的 webContents ID，默认为当前页面
   */
  toggleHistoryEnabled: (enabled: boolean, webContentsId?: number) =>
    ipcRenderer.send(tabTopic.handle.toggleHistoryEnabled, enabled, webContentsId),

  /**
   * 设置标签页宽度
   * @param width - 宽度值
   * @param webContentsId - 可选的 webContents ID，默认为当前页面
   */
  setWidth: (width: number, webContentsId?: number) =>
    ipcRenderer.send(tabTopic.handle.setWidth, width, webContentsId),

  /**
   * 切换用户代理设置
   * @param webContentsId - 可选的 webContents ID，默认为当前页面
   */
  toggleUserAgent: (webContentsId?: number) =>
    ipcRenderer.send(tabTopic.handle.toggleUserAgent, webContentsId),

  /**
   * 切换独立窗口模式
   * @param webContentsId - 可选的 webContents ID，默认为当前页面
   */
  toggleSeparateWindow: (webContentsId?: number) =>
    ipcRenderer.send(tabTopic.handle.toggleSeparateWindow, webContentsId),

  /**
   * 切换标签页固定状态
   * @param webContentsId - 可选的 webContents ID，默认为当前页面
   */
  togglePinned: (webContentsId?: number) =>
    ipcRenderer.send(tabTopic.handle.togglePinned, webContentsId),

  /**
   * 翻译当前页面
   * @param language - 目标语言
   * @param webContentsId - 可选的 webContents ID，默认为当前页面
   */
  translatePage: (language: string, webContentsId?: number) =>
    ipcRenderer.send(tabTopic.handle.translatePage, language, webContentsId),

  /**
   * 恢复原始页面（取消翻译等操作）
   * @param webContentsId - 可选的 webContents ID，默认为当前页面
   */
  restoreOriginal: (webContentsId?: number) =>
    ipcRenderer.send(tabTopic.handle.restoreOriginal, webContentsId),

  /**
   * 设置 ESC 优先级（0 表示不处理；数值越大优先级越高）
   * @param priority - ESC 键处理优先级
   * @param webContentsId - 可选的 webContents ID，默认为当前页面
   */
  setEscPriority: (priority: number, webContentsId?: number) =>
    ipcRenderer.send(tabTopic.handle.setEscPriority, priority, webContentsId),

  /**
   * 设置翻译状态
   * @param state - 翻译状态对象
   */
  translationState: (state: F2.tab.TranslationState) =>
    ipcRenderer.send(tabTopic.handle.tabTranslationState, state),

  /**
   * 在页面中查找文本
   * @param text - 要查找的文本
   * @param options - 查找选项配置
   * @param webContentsId - 可选的 webContents ID，默认为当前页面
   */
  findInPage: (text: string, options?: Electron.FindInPageOptions, webContentsId?: number) =>
    ipcRenderer.send(tabTopic.handle.findInPage, text, options, webContentsId),

  /**
   * 停止页面查找
   * @param webContentsId - 可选的 webContents ID，默认为当前页面
   */
  stopFindInPage: (webContentsId?: number) =>
    ipcRenderer.send(tabTopic.handle.stopFindInPage, webContentsId),

  /**
   * 关闭标签页
   * @param webContentsId - 可选的 webContents ID，默认为当前页面
   */
  close: (webContentsId?: number) => ipcRenderer.send(tabTopic.handle.closeTab, webContentsId),

  /**
   * 设置工具栏配置（用于独立窗口）
   * @param config - 工具栏配置对象
   * @param webContentsId - 可选的 webContents ID，默认为当前页面
   */
  setToolbarConfig: (config: F2.toolbar.Config, webContentsId?: number) =>
    ipcRenderer.send(tabTopic.handle.setToolbarConfig, config, webContentsId),

  /**
   * 工具栏按钮点击事件
   * @param buttonId - 按钮 ID
   * @param webContentsId - 可选的 webContents ID，默认为当前页面
   */
  toolbarButtonClick: (buttonId: string, webContentsId?: number) =>
    ipcRenderer.send(toolbarTopic.buttonClick, buttonId, webContentsId)
}
